package cn.itcast.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.itcast.dao.MenuDao;
import cn.itcast.dao.PermissionDao;
import cn.itcast.entity.PageResult;
import cn.itcast.entity.QueryPageBean;
import cn.itcast.pojo.Menu;
import cn.itcast.service.MenuService;
import cn.itcast.vo.MenuListVo;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;


@Service
public class MenuServiceImpl implements MenuService {

    @Autowired
    private MenuDao menuDao;

    @Autowired
    private PermissionDao permissionDao;


    /**
     * 分页查询菜单列表
     * @param queryPageBean 查询条件
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //开启分页查询
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //根据条件分页查询检查项信息
        Page<Menu> page = menuDao.findPage(queryPageBean.getQueryString());
        //构建分页数据返回
        return new PageResult(page.getTotal(), page.getResult());
    }



    /**
     * 新增菜单/新增子菜单
     * @param permissionIds 权限id数组
     * @param menu  菜单的基本数据
     * @return
     */
    @Override
    public Boolean handleAdd(int[] permissionIds, Menu menu) {

        //当数组中有权限id的时候，表明是新增子菜单
        if (permissionIds.length > 0 && permissionIds != null){
            //二级菜单
            menuDao.handleAdd(menu);
            //将当前菜单的权限添加到t_menu_permission表中
            for (int i = 0; i < permissionIds.length; i++) {
                menuDao.addMenuAndPermission( menu.getId(), permissionIds[i]);
            }
            return true;
        }else {
            //新增菜单(一级菜单)
            menu.setParentMenuId(0);
            return menuDao.handleAdd(menu) > 0;
        }
    }


    /**
     * 根据id查询单条菜单信息
     * @param id
     * @return
     */
    @Override
    public Menu handleUpdate(Integer id) {
        return menuDao.findById(id);
    }




    /**
     * 根据id查询单条菜单的权限信息
     * @param id
     * @return
     */
    @Override
    public List<Integer> handleUpdatePermissions(Integer id) {
        return menuDao.handleUpdatePermissions(id);
    }


    /**
     * 编辑一级菜单/编辑二级菜单
     * @param permissionIds 权限id数组
     * @param menu  菜单的基本数据
     * @return
     */
    @Override
    public Boolean handleEdit(int[] permissionIds, Menu menu) {
        //当数组中有权限id的时候，表明是新增子菜单
        if (permissionIds.length > 0 && permissionIds != null){
            //先删除以前的权限
            menuDao.deletePermission(menu.getId());
            //二级菜单
            //将当前菜单的权限添加到t_menu_permission表中
            for (int i = 0; i < permissionIds.length; i++) {
                menuDao.addMenuAndPermission(menu.getId(), permissionIds[i]);
            }
        }
        return menuDao.handleEdit(menu) > 0;
    }


    /**
     * 根据id删除菜单
     * @param id  菜单的基本数据
     * @return
     */
    @Override
    public Boolean handleDelete(Integer id) {
        //判断当前是否是以及菜单，如果是以一级菜单，判断是否有子级菜单，如果有，则删除失败
        Menu menu = menuDao.findById(id);
        System.out.println("1 = " + menu);
        //等于1 说明1级菜单，不能直接删除
        if (menu.getLevel() == 1){
            System.out.println("2 = " + menu);
            //根绝当前id，查询是由有子级菜单
            List<Menu> byParentId = menuDao.findByParentId(id);
            System.out.println("3 = " + byParentId.size());
            if (byParentId.size() > 0 ){
                return false;
            }
            return menuDao.handleDelete(id) > 0;
        }
        //删除子菜单
        menuDao.handleDelete(id);
        //删除权限表中的数据
        return menuDao.handleDeletePermission(id) > 0;
    }


    /**
     * 动态菜单
     * @param userId
     * @return
     */
    @Override
    public List<MenuListVo> findMenuByUserId(Integer userId) {
        List<MenuListVo> menuListVos = menuDao.findMenuByUserId(userId);
        List<String> names = menuDao.findMenuNameByUserId(userId);
        for (int i = 0; i < menuListVos.size(); i++) {
            for (int j = 0; j < menuListVos.get(i).getChildren().size(); j++) {
                if (!CollectionUtil.contains(names, menuListVos.get(i).getChildren().get(j).getTitle())) {
                    menuListVos.get(i).getChildren().remove(j);
                }
            }
        }
        return menuListVos;
    }


}
